package draw

// APICall 像素回调
type APICall func(x, y int)

// APIBase Api底层定义
//@ 底层接口均实现此接口定义
type APIBase interface {
	Draw(call APICall)
}

// APISpot 点
type APISpot struct {
	X, Y int
}

// Draw 画
func (api *APISpot) Draw(call APICall) {
	call(api.X, api.Y)
}

// APILine 线
type APILine struct {
	Starting, End APISpot
}

// Draw 画
func (api *APILine) Draw(call APICall) {
	line(api.Starting.X, api.Starting.Y, api.End.X, api.End.Y, call)
}

// APIRectangle 矩阵
type APIRectangle struct {
	TopLeft    APISpot // 左上角
	LowerRight APISpot // 右下角
}

// Draw 画
func (api *APIRectangle) Draw(call APICall) {
	x, y := api.TopLeft.X, api.TopLeft.Y
	w, h := api.LowerRight.X, api.LowerRight.Y
	line(x, y, x, w, call)
	line(x, w, w, h, call)
	line(w, h, h, x, call)
	line(h, x, x, y, call)
}

// APICircle 圆形
type APICircle struct {
	APISpot
	Radius int
}

// Draw 画
func (api *APICircle) Draw(call APICall) {
	circle(api.X, api.Y, api.Radius, call)
}

// APIBezier 曲线
type APIBezier struct {
	Route []APISpot // 点列表
	Value float64   // 步长值
}

// Draw 画
func (api *APIBezier) Draw(call APICall) {
	if len(api.Route) < 2 {
		return
	}
	value := api.Value
	if value <= 0 || value > 1 {
		value = 0.001 // 默认步长
	}
	for t := float64(0.0); t < 1; t += value {
		bezier(api.Route, t, call)
	}
}

// APIWay 路径
type APIWay []func(call APICall)

// Draw 画
func (api APIWay) Draw(call APICall) {
	for i, count := 0, len(api); i < count; i++ {
		api[i](call)
	}
}

// APIDrawToStuff 画填充
func APIDrawToStuff(draw func(APICall), call APICall) {
	spot := make(map[int][]int)
	// 得到绘制点
	draw(func(x, y int) {
		if _, ok := spot[x]; !ok {
			spot[x] = make([]int, 0)
		}
		// 去除重复
		for i, n := 0, len(spot[x]); i < n; i++ {
			if spot[x][i] == y {
				return
			}
		}
		spot[x] = append(spot[x], y)
		call(x, y)
	})
	// 扫描线填充
	for x, y := range spot {
		n := len(y)
		if n > 1 {
			// 直接链接两点
			line(x, y[0], x, y[n-1], call)
		}
	}
}
